/**
 * Created on Jun 1, 2008
 *
 * Copyright (C) Azureus Software, Inc, All Rights Reserved.
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License only.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA 
 */

package com.aelitis.azureus.util;

import org.gudy.azureus2.core3.download.DownloadManager;
import org.gudy.azureus2.core3.global.GlobalManager;
import org.gudy.azureus2.core3.torrent.TOTorrent;
import org.gudy.azureus2.core3.util.Base32;
import org.gudy.azureus2.core3.util.Debug;
import org.gudy.azureus2.core3.util.HashWrapper;
import org.gudy.azureus2.plugins.disk.DiskManagerFileInfo;
import org.gudy.azureus2.pluginsimpl.local.PluginCoreUtils;

import com.aelitis.azureus.core.AzureusCoreFactory;
import com.aelitis.azureus.core.torrent.PlatformTorrentUtils;
import com.aelitis.azureus.ui.selectedcontent.DownloadUrlInfo;
import com.aelitis.azureus.ui.selectedcontent.ISelectedContent;

/**
 * @author TuxPaper
 * @created Jun 1, 2008
 * 
 */
public class DataSourceUtils {
    public static org.gudy.azureus2.core3.disk.DiskManagerFileInfo getFileInfo(Object ds) {
        try {
            if (ds instanceof DiskManagerFileInfo) {
                return PluginCoreUtils.unwrap((DiskManagerFileInfo) ds);
            } else if (ds instanceof org.gudy.azureus2.core3.disk.DiskManagerFileInfo) {
                return (org.gudy.azureus2.core3.disk.DiskManagerFileInfo) ds;
            } else if ((ds instanceof ISelectedContent) && ((ISelectedContent) ds).getFileIndex() >= 0) {
                ISelectedContent sc = (ISelectedContent) ds;
                int idx = sc.getFileIndex();
                DownloadManager dm = sc.getDownloadManager();
                return dm.getDiskManagerFileInfoSet().getFiles()[idx];
                // } else if (ds instanceof TranscodeJob) {
                // TranscodeJob tj = (TranscodeJob) ds;
                // try {
                // return PluginCoreUtils.unwrap(tj.getFile());
                // } catch (DownloadException e) {
                // }
                // } else if (ds instanceof TranscodeFile) {
                // TranscodeFile tf = (TranscodeFile) ds;
                // try {
                // DiskManagerFileInfo file = tf.getSourceFile();
                // return PluginCoreUtils.unwrap(file);
                // } catch (DownloadException e) {
                // }
            }

        } catch (Exception e) {
            Debug.printStackTrace(e);
        }
        return null;
    }

    public static DownloadManager getDM(Object ds) {
        try {
            if (ds instanceof DownloadManager) {
                return (DownloadManager) ds;
                // } else if (ds instanceof VuzeActivitiesEntry) {
                // VuzeActivitiesEntry entry = (VuzeActivitiesEntry) ds;
                // DownloadManager dm = entry.getDownloadManger();
                // if (dm == null) {
                // String assetHash = entry.getAssetHash();
                // if (assetHash != null && AzureusCoreFactory.isCoreRunning()) {
                // GlobalManager gm = AzureusCoreFactory.getSingleton().getGlobalManager();
                // dm = gm.getDownloadManager(new HashWrapper(Base32.decode(assetHash)));
                // entry.setDownloadManager(dm);
                // }
                // }
                // return dm;
            } else if ((ds instanceof TOTorrent) && AzureusCoreFactory.isCoreRunning()) {
                GlobalManager gm = AzureusCoreFactory.getSingleton().getGlobalManager();
                return gm.getDownloadManager((TOTorrent) ds);
            } else if (ds instanceof ISelectedContent) {
                return getDM(((ISelectedContent) ds).getDownloadManager());
                // } else if (ds instanceof TranscodeJob) {
                // TranscodeJob tj = (TranscodeJob) ds;
                // try {
                // DiskManagerFileInfo file = tj.getFile();
                // if (file != null) {
                // Download download = tj.getFile().getDownload();
                // if (download != null) {
                // return PluginCoreUtils.unwrap(download);
                // }
                // }
                // } catch (DownloadException e) {
                // }
                // } else if (ds instanceof TranscodeFile) {
                // TranscodeFile tf = (TranscodeFile) ds;
                // try {
                // DiskManagerFileInfo file = tf.getSourceFile();
                // if (file != null) {
                // Download download = file.getDownload();
                // if (download != null) {
                // return PluginCoreUtils.unwrap(download);
                // }
                // }
                // } catch (DownloadException e) {
                // }
                // } else if (ds instanceof DeviceOfflineDownload) {
                // return (PluginCoreUtils.unwrap(((DeviceOfflineDownload) ds).getDownload()));
                // } else if ((ds instanceof String) && AzureusCoreFactory.isCoreRunning()) {
                // String hash = (String) ds;
                // try {
                // GlobalManager gm = AzureusCoreFactory.getSingleton().getGlobalManager();
                // DownloadManager dm = gm.getDownloadManager(new HashWrapper(Base32.decode(hash)));
                // if (dm != null) {
                // return dm;
                // }
                // } catch (Exception e) {
                // // ignore
                // }
            }

        } catch (Exception e) {
            Debug.printStackTrace(e);
        }
        return null;
    }

    public static TOTorrent getTorrent(Object ds) {
        if (ds instanceof TOTorrent) {
            return (TOTorrent) ds;
        }

        if (ds instanceof DownloadManager) {
            TOTorrent torrent = ((DownloadManager) ds).getTorrent();
            if (torrent != null) {
                return torrent;
            }
        }
        // if (ds instanceof VuzeActivitiesEntry) {
        // TOTorrent torrent = ((VuzeActivitiesEntry) ds).getTorrent();
        // if (torrent == null) {
        // // getDM will check hash as well
        // DownloadManager dm = getDM(ds);
        // if (dm != null) {
        // torrent = dm.getTorrent();
        // }
        // }
        // return torrent;
        // }
        //
        // if (ds instanceof TranscodeFile) {
        // TranscodeFile tf = (TranscodeFile) ds;
        // try {
        // DiskManagerFileInfo file = tf.getSourceFile();
        // if (file != null) {
        // Download download = file.getDownload();
        // if (download != null) {
        // Torrent torrent = download.getTorrent();
        // if (torrent != null) {
        // return PluginCoreUtils.unwrap(torrent);
        // }
        // }
        // }
        // } catch (Throwable e) {
        // }
        // }
        //
        // if (ds instanceof TranscodeJob) {
        // TranscodeJob tj = (TranscodeJob) ds;
        // try {
        // DiskManagerFileInfo file = tj.getFile();
        // if (file != null) {
        // Download download = tj.getFile().getDownload();
        //
        // if (download != null) {
        // Torrent torrent = download.getTorrent();
        // if (torrent != null) {
        // return PluginCoreUtils.unwrap(torrent);
        // }
        // }
        // }
        // } catch (DownloadException e) {
        // }
        // }
        //
        // if (ds instanceof DeviceOfflineDownload) {
        // Torrent torrent = ((DeviceOfflineDownload) ds).getDownload().getTorrent();
        // if (torrent != null) {
        // return PluginCoreUtils.unwrap(torrent);
        // }
        // }

        if (ds instanceof ISelectedContent) {
            return ((ISelectedContent) ds).getTorrent();
        }

        if (ds instanceof String) {
            String hash = (String) ds;
            try {
                GlobalManager gm = AzureusCoreFactory.getSingleton().getGlobalManager();
                DownloadManager dm = gm.getDownloadManager(new HashWrapper(Base32.decode(hash)));
                if (dm != null) {
                    return dm.getTorrent();
                }
            } catch (Exception e) {
                // ignore
            }
        }

        return null;
    }

    /**
     * @return
     * 
     * @since 3.0.5.3
     */
    public static boolean isPlatformContent(Object ds) {
        TOTorrent torrent = getTorrent(ds);
        if (torrent != null) {
            return PlatformTorrentUtils.isContent(torrent, true);
        }
        // if (ds instanceof VuzeActivitiesEntry) {
        // return true;
        // }

        return false;
    }

    public static String getHash(Object ds) {
        try {
            if (ds instanceof DownloadManager) {
                return ((DownloadManager) ds).getTorrent().getHashWrapper().toBase32String();
            } else if (ds instanceof TOTorrent) {
                return ((TOTorrent) ds).getHashWrapper().toBase32String();
                // } else if (ds instanceof DeviceOfflineDownload) {
                // return (getHash(PluginCoreUtils.unwrap(((DeviceOfflineDownload) ds).getDownload())));
                // } else if (ds instanceof VuzeActivitiesEntry) {
                // VuzeActivitiesEntry entry = (VuzeActivitiesEntry) ds;
                // return entry.getAssetHash();
            } else if (ds instanceof ISelectedContent) {
                return ((ISelectedContent) ds).getHash();
            } else if (ds instanceof String) {
                return (String) ds;
            }
        } catch (Exception e) {
            Debug.printStackTrace(e);
        }
        return null;
    }

    /**
     * @param ds
     * 
     * @since 3.1.1.1
     */
    public static DownloadUrlInfo getDownloadInfo(Object ds) {
        if (ds instanceof ISelectedContent) {
            return ((ISelectedContent) ds).getDownloadInfo();
        }
        return null;
    }

}
